package voxToolkit;

import grafico.Fabrica;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.Box;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

import audio.AudioSintetizado;

public class VoxYesNoCancel extends JDialog implements FocusListener, ActionListener, KeyListener{

	private static final long serialVersionUID = 1L;
	private String rotulo;
	private String mensagem;
	public static int APPROVE_OPTION = 0;
	private Boolean jaFalou = false;
	VoxTextArea textoMsg;
	JPanel painelBotoes;
	
	private AudioSintetizado sintetizador;
	private VoxButtonEvent voxButtonEvent;
		
		/**
	 * Cria uma caixa de mensagem com botões "Sim", "Não" e 
	 * "Cancelar".
	 * @param owner
	 * @param mensagem
	 */
	public VoxYesNoCancel(JFrame owner, String mensagem){
			
		this.mensagem = mensagem;
		this.rotulo = "Caixa de Mensagem";
		sintetizador = AudioSintetizado.instancia();
		voxButtonEvent = VoxButtonEvent.instancia();
		
		this.addFocusListener(this);
		montaGUI(owner);
	}


	private void montaGUI(JFrame owner){
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		
		setPreferredSize(new Dimension(500,150));
		this.setMinimumSize(new Dimension (500,150));
				
		setLocationRelativeTo(owner);
		this.setResizable(false);			
		Container principal = this.getContentPane();
			
		JPanel painelMensagem = Fabrica.painelFundoAzul();
		principal.add(painelMensagem,BorderLayout.CENTER);
		
		
		painelBotoes = Fabrica.painelFundoAzul();
		FlowLayout flowBotoes = new FlowLayout();
		flowBotoes.setHgap(30);
		painelBotoes.setLayout(flowBotoes);
		
		principal.add(painelBotoes,BorderLayout.PAGE_END);		
		principal.setFocusable(true);
		
		
		textoMsg = new VoxTextArea(mensagem,"");
		
		textoMsg.setBorder(FabricaVoxToolkit.bordaEscura);
		textoMsg.setBackground(FabricaVoxToolkit.background);
		textoMsg.setForeground(FabricaVoxToolkit.branco);
		textoMsg.setFont(FabricaVoxToolkit.fonteGrande);
		
		
		textoMsg.setSize(new Dimension (450,95));
		textoMsg.setEditable(false);
		textoMsg.setVisible(true);
		textoMsg.setLineWrap(true);
		textoMsg.setWrapStyleWord(true);
		textoMsg.setAlignmentX(CENTER_ALIGNMENT);
		textoMsg.setAlignmentY(CENTER_ALIGNMENT);
		textoMsg.setFocusable(false);
		
		painelMensagem.add(textoMsg, BorderLayout.CENTER);
							
		VoxButton btOk = new VoxButton("sim", "Sim");		
		btOk.addActionListener(this);
		btOk.addKeyListener(this);
		btOk.addFocusListener(voxButtonEvent);
		btOk.setFocusable(true);
		painelBotoes.add(btOk);
		
		VoxButton btNo = new VoxButton("nao", "Não");
		btNo.addActionListener(this);
		btNo.addKeyListener(this);
		btNo.addFocusListener(voxButtonEvent);
		btNo.setFocusable(true);
		painelBotoes.add(btNo);
		
		
		VoxButton btCancel = new VoxButton("cancel", "Cancelar");
		btCancel.addActionListener(this);
		btCancel.addKeyListener(this);
		btCancel.addFocusListener(voxButtonEvent);
		btCancel.setFocusable(true);
		painelBotoes.add(btCancel);
		
		principal.addFocusListener(this);
		
		setModal(true);
		setVisible(true);
		
						
	}

	public void setRotulo(String rotulo) {
		this.rotulo = rotulo;
	}
	
	public String getRotulo(){
		return rotulo;
	}
	
	public String getMensagem() {
		return mensagem;
	}
	
	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}
	
	public Boolean getJaFalou(){
		return jaFalou;
	}
	
	public void setJaFalou(Boolean falou){
		this.jaFalou = falou;
	}
	
	/**
	 * Realiza a ação correspondente a cada botão. Botão "sim" torna
	 * APPROVE_OPTION = 1 e fecha o diálogo, botão "nao" torna
	 * APRROVE_OPTION = 2 e fecha o diálogo, botão "cancel" torna
	 * APPROVE_OPTION = 0 e fecha o diálogo.
	 * @param botao
	 */
	
	public void acaoBotao(VoxButton botao){
		if (botao.getNome().equals("sim")){
			APPROVE_OPTION = 1;
			dispose();			
		}
		else if (botao.getNome().equals("nao")){
			APPROVE_OPTION = 2;
			dispose();
		}
		else if (botao.getNome().equals("cancel")){
			dispose();		
			APPROVE_OPTION = 0;
		}
	}

	
	@Override

	public void focusGained(FocusEvent e) {
		
				
		if ( e.getSource() instanceof Container ){
		
			if (!(getJaFalou())){
				sintetizador.abortaFala();
				sintetizador.escreve(this.getRotulo() + ". " + this.getMensagem());
				this.setJaFalou(true);
				painelBotoes.requestFocus();
			}
			else{
				sintetizador.abortaFala();
				sintetizador.escreve(this.getMensagem());
			}
		
		}
	
	}
		


	@Override
	public void focusLost(FocusEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		acaoBotao((VoxButton)e.getSource());
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
			
	}

	@Override
	public void keyTyped(KeyEvent e) {
		
		acaoBotao((VoxButton)e.getSource());
				
	}
	
	
}